<?php
namespace App\Common\Cla\ClaBase\Traits\ControllerModel\Page;

use App\Common as com;
use think\facade\Request;
use think\facade\App;

/**
 * 页面控制器主入口模型
 */
trait MainHandle {
	protected $actionName = 'action';
	
	/**
	 * 页面入口
	 * @return string
	 */
	public function main( ){
		return $this->mainHandle();
	}

	/**
	 * 页面入口处理器
	 * @param mixed ...$args
	 * @return mixed
	 */
	protected function mainHandle( ...$args ) {
		// 页面参数检测
		if( method_exists( $this, 'handleInit' ) ){
			$initReturn = $this->handleInit( ...$args );
			if( $initReturn !== true && $initReturn !== null ){
				if( $initReturn !== false ){
					return $initReturn;
				}else{
					throw com\Lib\Err\Exception::makeOfNew( '页面初始化失败', com\Cla\Err\Code::$sysDataValidateError );
				}
			}
		}
		// 执行页面类型方法
		$return_data = $this->handleAction();
		if( $return_data !== null ){
			return $return_data;
		}else{
			abort(404,'页面不存在');
		}
	}


	/**
	 * 初始化页面数据，并检查页面参数
	 * @return mixed||bool||null 初始化结果 [true|null]初始化成功 [{other_type}]初始化失败，并返回需要输出的数据
	 */
	/*
	protected function handleInit(){
		return null;
	}
	*/

	/**
	 * 显示页面
	 * @return string 需要返回的页面内容
	 */
	/*
	protected function handleGetOfMain(){
		abort(404,'页面不存在');
	}
	*/

	/**
	 * 显示页面
	 * @return string||null [{str}]执行成功，并返回页面内容 [{null}]没找到方法名
	 */
	protected function handleAction() {
		if( Request::instance()->isGet() ){
			return $this->handleGet();
		}else if( Request::instance()->isPost() ){
			return $this->handlePost();
		}else{
			return null;
		}
	}

	/**
	 * GET资源处理器
	 * @return string|null [{str}]执行成功，并返回页面内容 [{null}]没找到方法名
	 */
	protected function handleGet() {
		$get_param['action'] = Request::instance()->get( $this->actionName, '' );
		if( $get_param['action'] == '' ){
			$get_param['action'] = 'main';
		}
		//
		return $this->executeMethod( 'get', $get_param['action'] ) ?? com\Lib\Api\Response::error( '404.NO_GET_ACTION.' . $get_param['action'] )->toJson();
	}
	
	/**
	 * POST资源处理器
	 * @return string|null [{str}]执行成功，并返回页面内容 [{null}]没找到方法名
	 */
	protected function handlePost() {
		$post_param['action'] = Request::instance()->post( $this->actionName, '' );
		if( $post_param['action'] == '' ){
			$post_param['action'] = 'main';
		}
		//
		return $this->executeMethod( 'post', $post_param['action'] ) ?? com\Lib\Api\Response::error( '404.NO_POST_ACTION.' . $post_param['action'] )->toJson();
	}
	
	/**
	 * 执行对应的方法
	 * @param string $action_type 访问类型 [get] [post]
	 * @param string $action 执行的动作名
	 * @return string|null [{str}]执行成功，并返回页面内容 [{null}]没找到方法名
	 */
	protected function executeMethod( string $action_type, string $action ) {
		$action_type = $action_type == 'get' ? 'Get' : 'Post';
		$aciton_method_name = "handle{$action_type}Of" . com\Lib\Fun\Str::parseName( $action, 1 );
		// 处理动作
		if( method_exists( $this, $aciton_method_name ) ){
			return call_user_func_array( [ $this, $aciton_method_name ], [] ) ?? '';
		}else{
			return null;
		}
	}

}
